<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	

<script>

// 封装，多态，继承，抽象

/////////////////////////////////////////////////////////// wbc8


// 非构造函数继承

// 方式一
var Animal = {
    type: 'animal',
    food: ['egg', 'banana', [1, 2]],
    eat: function() {
        console.log('eating...');
    }
};

/*var Dog = {
    name: 'dog1',
    kanm: function() {
        console.log(this.name + ' 正在看门');
    }
};*/

/*function object(o) {
    function F() {};
    F.prototype = o;
    return new F();
}

var Dog = object(Animal);

Dog.name = 'dog1';
Dog.kanm = function() {
    console.log(this.name + ' 正在看门');
}*/

// 方式二 浅复制

/*function extendCopy(Parent) {
    var Child = {};
    for (var i in Parent) {
        Child[i] = Parent[i];
    }
    return Child;
}

var Dog = extendCopy(Animal);
Dog.name = 'dog1';
Dog.kanm = function() {
    console.log(this.name + ' 正在看门');
}*/

// 方式三 深复制

function deepCopy(Parent, Child) {
    Child = Child || {};

    for (var i in Parent) {
        if (typeof Parent[i] == 'object') {
            Child[i] = (Parent[i] instanceof Array) ? [] : {};
            /*if (Parent[i] instanceof Array) {
                Child[i] = [];
            } else {
                Child[i] = {};
            }*/
            deepCopy(Parent[i], Child[i]);
        } else {
            Child[i] = Parent[i];
        }
    }

    return Child;
}

var Dog = deepCopy(Animal);

Dog.food.push('apple');

console.log(Dog);
console.log(Animal);

// 非构造函数继承

// function Animal() {
//     this.type = 'animal';
//     this.color = undefined;
//     this.eat = function() {
//         console.log('eating...');
//     }
// }

/*function Animal() {
    this.color = undefined;
}

Animal.prototype = {
    type: 'animal',
    eat: function() {
        console.log('eating...')
    }
};*/

// function Dog(name) {
//     this.name = name;
//     this.kanmen = function() {
//         console.log(this.name + ' 正在看门...');
//     }

//     Animal.apply(this, arguments);
    
// }

// function Cat(name) {
//     this.name = name;
//     /*this.zhuals = function() {
//         console.log(this.name + ' 正在抓老鼠...');
//     }*/
// }

// Cat.prototype = {
//     zhuals: function() {
//         console.log(this.name + ' 正在抓老鼠...');
//     }
// };

// 方法一
/*Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;*/

// 方法二
/*Dog.prototype = Animal.prototype;
Dog.prototype.constructor = Dog;

Cat.prototype = Animal.prototype;
Cat.prototype.constructor = Cat;*/

// 方法三
/*function extend(Child, Parent) {
    var F = function() {};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

extend(Dog, Animal);*/

// 方法四
/*function extend2(Child, Parent) {
    var c = Child.prototype;
    var p = Parent.prototype;
    for (var i in p) {
        c[i] = p[i];
    }
}

extend2(Cat, Animal);

extend2(Dog, Cat);*/

// 方法五



// var d1 = new Dog('wangcai');
// var c1 = new Cat('mimi');

// function Dog(name, color) {
//     this.name = name;
//     this.color = color;
//     /*this.type = 'animal';
//     this.run = function() {
//         console.log(this.name + " is running...");
//     }*/
// }

// Dog.prototype = {
//     type: 'animal',
//     run: function() {
//         console.log(this.name + " is running...")
//     }
// };

// var dog5 = new Dog('dog5', 'gray');
// var dog6 = new Dog('dog6', 'black');

/*var arr = new Array();
var d = new Date();*/

/*function Dog(name, color) {
    var obj = {
        name: name,
        color: color
    };
    return obj;
}

var dog3 = Dog('dog3', 'yellow');
var dog4 = Dog('dog4', 'block');*/

/*var Dog = {
    name: '',
    color: ''
};*/

/*var dog1 = {
    name: 'dog1',
    color: 'black'
};

var dog2 = {
    name: 'dog2',
    color: 'white'
}*/

// var a = 1;
// var b = 2; 
// var c = 3;

// var obj = {
//     a: 1,
//     b: 2, 
//     c: 3
// };

// function abc() {

// }

// function abc(x) {

// }

// function abc(x, y) {

// }

// abc(5, 7);

/////////////////////////////////////////////////////////// wbc8

/*var obj = {};
var obj2 = new Object();

var arr = [];
var arr2 = new Array();

var fun = function() {};

var date = new Date();

Math.random();

var rg = new RegExp();
var rg2 = /\d{3}/;*/

/*var obj = {
    name: 'abc',
    hello: function() {
        return this.name;
    }
};

obj.hello();

var obj2 = {};

obj2.name = "def";

obj2.hello = function() {
    return this.name;
};*/



////////////////////////////////////////////
// wbc7
/*var dog1 = {
    name: 'dog1',
    color: 'black'
};

var dog2 = {
    name: 'dog2',
    color: 'yellow'
};

var cat1 = {
    name: 'cat1',
    color: 'white'
};*/

//function Dog(name, color) {
//    return {
//        name: name,
//        color: color
//    };
//
//    /*var obj = {
//        name: name,
//        color: color
//    };
//
//    return obj;*/
//}
//
//var dog1 = Dog('dog1', 'black');
//var dog2 = Dog('dog2', 'yellow');

//function Dog(name, color) {
//    this.name = name;
//    this.color = color;
////    this.run = function() {
////        return this.name + ' is running...';
////    }
//}

//Dog.prototype = {
//    type: 'animal',
//    run: function() {
//        return this.name + ' is running....';
//    }
//};
//
//function Cat(name, color) {
//    this.name = name;
//    this.color = color;
//}
//
//var dog3 = new Dog('dog3', 'red');
//var dog4 = new Dog('dog4', 'gray');
//
//var cat1 = new Cat('cat1', 'white');


/*function Animal() {
    this.type = 'animal';
}

function Dog(name, color) {
    this.name = name;
    this.color = color;
}

Dog.prototype = new Animal();
//Dog.prototype.constructor = Dog;

var dog4 = new Dog('dog4', 'gray');
var dog5 = new Dog('dog5', 'gray');*/


// function Animal() {
// }

// Animal.prototype = {
//     type: 'animal',
//     run: function() {
//         return this.name + ' is running';
//     }
// };

// function Dog(name, color) {
//     this.name = name;
//     this.color = color;
// }

// function extend(Child, Parent) {
//     var F = function() {};
//     F.prototype = Parent.prototype;
//     Child.prototype = new F();
//     Child.prototype.constructor = Child;
//     Child.super = Parent.prototype;
// }

// extend(Dog, Animal);

// var dog6 = new Dog('dog6', 'black');


//Dog.prototype = Animal.prototype;
//
//var dog4 = new Dog('dog4', 'gray.');



////////////////////////////////////////////

//    wbc6
//    var d = new Date();
//    var td = new Dog();

/*var Dog = {
    name: "doudou",
    color: "black"
};*/

/*function Dog(name, color) {
     return {
         name: name,
         color: color
     };
 }

 var d1 = Dog("d1", "yellow");
 var d2 = Dog("d2", "black");
 var d3 = Dog("d3", "white");*/

//function Dog(name, color) {
//    this.name = name;
//    this.color = color;
//    /*this.type = "animal";
//    this.run = function() {
//        console.log("this dog is running...");
//    }*/
//}

//Dog.prototype = {
//    type: "animal",
//    run: function() {
//        console.log("this dog is running....");
//    }
//};
//
//function Cat(name, color) {
//    this.name = name;
//    this.color = color;
//}
//
//var d1 = new Dog("d1", "black");
//var d2 = new Dog("d2", "gray");
//
//var c1 = new Cat("c1", "yellow");


////////////////////////////////////////////////////////////////////////

//		var o = new Object();
//
//		var arr = new Array();
//
//		var d = new Date();
//
//		var dog1 = {
//			name: 'wangcai',
//			age: 2,
//			color: 'yellow',
//			eat: function() {
//				console.log(this.name + ' is eating...');
//			}
//		};
//
//		var dog2 = {
//			name: 'doudou',
//			age: 2.5,
//			color: 'white',
//			eat: function() {
//				console.log(this.name + ' is eating...');
//			}
//		};
//
//		var dog3 = createDog('xiaohei', 3, 'black');
//
//		function createDog(name, age, color) {
//			var dog = new Object();
//			dog.name = name;
//			dog.age = age;
//			dog.color = color;
//			dog.eat = function() {
//				console.log(this.name + ' is eating...');
//			}
//
//			return dog;
//		}
//
//		function Dog(name, age, color) {
//
//			// console.log(this);
//
//			this.name = name;
//			this.age = age;
//			this.color = color;
//			this.eat = eat;
//			// this.eat = function() {
//			// 	console.log(this.name + ' is eating...');
//			// }
//		}
//
//		// Dog.prototype
//
//		function eat() {
//			console.log(this.name + ' is eating....');
//		}
//
//		var dog4 = new Dog('xiaohua', 1.5, 'black and white');
//		var dog5 = new Dog('mudan', 2.5, 'black');
//		// var dog6 = Dog('shaoyao', 3, 'white');
//
//		var obj = {
//			length: '1.2m',
//			name: 'test'
//		};
//
//		// Dog.call(obj, 'maomao', 4, 'brown');
//		Dog.apply(obj, ['mm2', 2, 'brown']);
//
//
//		function Cat() {}
//
//		Cat.prototype.name = 'xiaoA';
//		Cat.prototype.age = 2;
//		Cat.prototype.color = 'white';
//		Cat.prototype.run = function() {
//			console.log(this.name + ' is running...');
//		}
//
//		var cat1 = new Cat();
//		var cat2 = new Cat();
//
//		function Monkey(name, age, color) {
//			this.name = name;
//			this.age = age;
//			this.color = color;
//		}
//
//		Monkey.prototype = {
//			climb: function() {
//				console.log(this.name + ' is climbing...');
//			},
//			run: function() {
//				console.log(this.name + ' is running...');
//			}
//		};
//
//		/*Monkey.prototype.climb = function() {
//			console.log(this.name + ' is climbing...');
//		};
//
//		Monkey.prototype.run = function() {
//			console.log(this.name + ' is running...');
//		};*/
//
//		var m1 = new Monkey('dasheng', 500, 'yellow');
//		var m2 = new Monkey('jiji', 50, 'brown');
//		var m3 = new Monkey('maomao', 5, 'yellow');

</script>
</body>
</html>